package hashing;

/* Hash: perfekte Hashfunktionen fuer Flughafen-Codes               */
/* Pos. der Buchstaben im Alphabet: A=1, B=2, ...,Z=26              */
/* Fuer A=0, ... bei der Bucketberechnung jeweils das "+1" loeschen */

public class Perfekt2
{
    static final int N = 10;

    // Feld fuer Ergebnisse (= Buckets) anlegen, Anzahl = Zahl der Flughaefen
    static String Codes[] =
    { "MUC", "LUX", "VLC", "FAO", "STR", "HAM", "CGN", "PMI", "FDH", "AGP" };

    static int Ziel_Buckets[] = new int[N];

    public static void main(String[] args)
    {
        // i,j,k entsprechen den Multiplikatoren fuer die Alphabetstelle;
        // mit dem Schranken kann man entsprechend spielen
        for (int i = -6; i < 7; i++)
            for (int j = -6; j < 7; j++)
                for (int k = -6; k < 7; k++)
                {
                    // fuer alle 10 Flughaefen Ziel-Bucket berechnen
                    for (int m = 0; m < 10; m++)
                    {
                        Ziel_Buckets[m] = Math.abs((Codes[m].charAt(0) - 'A' + 1) * i + (Codes[m].charAt(1) - 'A' + 1) * j + (Codes[m].charAt(2) - 'A' + 1) * k);
                        Ziel_Buckets[m] = Ziel_Buckets[m] % N;
                    }
                    boolean ok = true;

                    // Jetzt fuer alle Ziel-Buckets pruefen, ob 2 gleich sind,
                    // dann ok == false setzen.
                    m: for (int n = 0; n < 9; n++)
                        for (int o = n + 1; o < 10; o++)
                            if (Ziel_Buckets[n] == Ziel_Buckets[o])
                            {
                                ok = false;
                                // Treffer: wir koennen die beiden Scheifen
                                // verlassen
                                // "break m;" verlaesst die mit m: markierte
                                // Schleife
                                break m;
                            }
                    // Wenn alle Buckets verschieden, Werte fuer i,j,k sowie
                    // Divisor N ausgeben;
                    // danach die Buckets fuer alle 10 Flughaefen in obiger
                    // Reihenfolge ausgeben.
                    if (ok)
                    {
                        System.out.println("(1. Buchstabe * " + i + " + 2. Buchstabe * " + j + " + 3. Buchstabe * " + k + ") mod " + N);

                        for (int u = 0; u < 10; u++)
                            System.out.print(Codes[u] + " " + Ziel_Buckets[u] + " | ");
                        System.out.print("\n");
                    }
                }
    }
}
